package com.probiz.estore.common.helper;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Locale;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.probiz.estore.Constants;
import com.probiz.estore.common.model.system.CompanyInfo;
import com.probiz.estore.common.util.FileUtil;
import com.probiz.estore.core.util.I18nUtil;
import com.probiz.estore.core.util.StringUtil;
import com.probiz.estore.core.util.UrlUtil;
import com.probiz.estore.system.service.SystemConfigManager;
import com.probiz.estore.webapp.util.RequestContext;

/**
 * 提供系统配置的统一的使用接口。Java程序内直接调用各个API。JSP内用${appConfig.isDemoMode}这样的EL使用。<BR>
 * 
 */
public class ConfigUtil {
	private final static ConfigUtil configUtil = new ConfigUtil();

	private static final Log logger = LogFactory.getLog(ConfigUtil.class);


	public static ConfigUtil getInstance() {
		return configUtil;
	}

	private String ctxPath = "Not Initialized";

	private boolean isStoreFront = false;

	private boolean isMobileFront = false;
	
	private boolean serverSideDataCacheEnabled = true;

	private SystemConfigManager systemConfigManager;

	private String webAppRootPath = null;

	private boolean eaiEnabled = false;

	private ConfigUtil() {
	}

	/**
	 * 从数据库读取并设置网上商店和商店管理系统的网站URL。注意，第一次启动，其数据可能是错误的，在登录时候会检查并自动跳转到系统配置页面。
	 * 
	 */
	public void checkConfigAtStartup() {
		logger.info("Initializing servlet context path...");
		logger.info("Using config [StoreAdminSiteUrl]: " + getStoreAdminSiteUrl());
		logger.info("Using config [StoreFrontSiteUrl]:" + getStoreFrontSiteUrl());

		String tmpCtxPath = null;
		if (getIsStoreFront()) {
			try {
				URL storeFrontUrl = new URL(getStoreFrontSiteUrl());
				tmpCtxPath = storeFrontUrl.getPath();
			} catch (MalformedURLException e) {
				logger.error("StoreFrontSiteUrl is not configured correctly. Start StoreAdmin and correct it, then retry.", e);
			}
		} else if(getIsMobileFront()) {
			try {
				URL mobileFrontUrl = new URL(getMobileFrontSiteUrl());
				tmpCtxPath = mobileFrontUrl.getPath();
			} catch (MalformedURLException e) {
				logger.error("mobileFrontUrl is not configured correctly. Start StoreAdmin and correct it, then retry.", e);
			}
		} else {
			try {
				URL storeAdminUrl = new URL(getStoreAdminSiteUrl());
				tmpCtxPath = storeAdminUrl.getPath();
			} catch (MalformedURLException e) {
				logger.error("Store Admin site url is not configured correctly!", e);
			}
		}

		if (getStoreFrontSiteUrl().indexOf("localhost") > 0) {
			logger.warn("StoreFrontSiteUrl is not correctly configured, localhost is dected in the URL, emails and some other functions may not work propertly.");
		}

		initContextPath(tmpCtxPath);
	}

	public final boolean checkInvalidSystemConfigs() {
		int oriMsgSize = RequestContext.getSessionMessageCount();
		 if ( !getStoreFrontSiteUrl().contains("localhost") && !UrlUtil.isUrlValid(getStoreFrontSiteUrl())) {
			 saveInvalidConfigMessage("storeFrontSiteUrl");
		 }
		 if ( !getStoreAdminSiteUrl().contains("localhost") && !UrlUtil.isUrlValid(getStoreAdminSiteUrl())) {
			 saveInvalidConfigMessage("storeAdminSiteUrl");
		 }
		File tmpFile = new File(getStoreFrontInstallationPath());
		if (!tmpFile.exists()) {
			saveInvalidConfigMessage("storeFrontInstallationPath");
		}
		return (RequestContext.getSessionMessageCount() - oriMsgSize > 0);
	}

	


	public CompanyInfo getCompanyInfo() {
		return this.systemConfigManager.getCompanyInfo();
	}

	protected final String getConfig(String key) {
		String confValue = systemConfigManager.getConfigMap().get(key);
		if (confValue == null) {
			logger.warn("Requesting config not found， register a default config. Config key is:[" + key + "].");
		}
		return confValue;
	}

	protected final Integer getConfig(String key, int defValue) {
		return new Integer(getConfig(key, "" + defValue));
	}

	protected final String getConfig(String key, String defValue) {
		String configValue = getConfig(key);
		return StringUtils.isNotBlank(configValue)?configValue:defValue;
	}

	protected final String[] getConfigAsArray(String key) {
		return StringUtil.toArray(getConfig(key));
	}

	protected final String[] getConfigAsArray(String key, String delim) {
		return StringUtil.toArrayByDel(getConfig(key), delim);
	}

	protected final boolean getConfigAsBool(String key, boolean defValue) {
		return Boolean.parseBoolean(getConfig(key, "" + defValue));
	}

	protected final double getConfigAsDouble(String key, double defValue) {
		return Double.parseDouble(getConfig(key, "" + defValue));
	}

	protected final int getConfigAsInt(String key, int defValue) {
		return Integer.parseInt(getConfig(key, "" + defValue));
	}


	
	

	/**
	 * has leading / (when is not root web application), but no ending /.
	 * 
	 * @return
	 */
	public String getCtxPath() {
		return ctxPath;
	}


	/**
	 * 缺货，低库存通知邮件模板
	 * 
	 * @return
	 */
	public String getStockAlertEmailTemplate() {
		return "product/stockAlert.vm";
	}

	/**
	 * 礼券邮件模板
	 * 
	 * @return
	 */
	public String getGiftCertificateEmailTemplate() {
		return "sales/giftCertificate/giftcertificateMail.vm";
	}

	/**
	 * 优惠券邮件模板
	 * 
	 * @return
	 */
	public String getCouponEmailTemplate() {
		return "sales/coupon/couponMail.vm";
	}

	/**
	 * 到货通知邮件模板
	 * 
	 * @return
	 */
	public String getStockNotifyEmailTemplate() {
		return "product/stockNotify.vm";
	}

	

	/**
	 * 根据约定的规则，根据emailCode读取相应的参数以判断该邮件是否启用。
	 * 
	 * @param emailCode
	 * @return
	 */
	public boolean getIsEmailEnabled(final String emailCode) {
		return this.getConfigAsBool("is" + StringUtils.capitalize(emailCode) + "EmailEnabled", true);
	}

	
	/**
	 * @return
	 */
	public boolean getIsServerSideDataCacheEnabled() {
		return serverSideDataCacheEnabled;
	}


	public boolean getIsStoreFront() {
		return isStoreFront;
	}
	
	public void setStoreFront(boolean isStoreFront) {
		this.isStoreFront = isStoreFront;
	}
	
	public boolean getIsMobileFront() {
		return isMobileFront;
	}

	public void setMobileFront(boolean isMobileFront) {
		this.isMobileFront = isMobileFront;
	}

	public String getWebAppRootPath() {
		return this.webAppRootPath;
	}


	public void initContextPath(String in_ctxPath) {
		if ("/".equals(ctxPath)) {
			ctxPath = "";
		} else {
			ctxPath = in_ctxPath;
		}
		// use be used in EL like: ${applicationScope.ctxPath}
		RequestContext.getServletContext().setAttribute(Constants.CONTEXT_PATH, ctxPath);

	}

	/**
	 * 包括更新数据库和缓存（Map）
	 * 
	 * @param configKey
	 * @param configValue
	 */
	public final void onConfigChanged() {
		Map<String,String> map = systemConfigManager.getConfigMap();
		Map<String,String> mapNew = systemConfigManager.getConfigMapNoCache();
		map.clear();
		map.putAll(mapNew);
		//检查配置项
		checkConfigAtStartup();
	}

	private final void saveInvalidConfigMessage(String configKey) {
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		sb.append(I18nUtil.getInstance().getMessage("conf.name." + configKey));
		sb.append("]");
		sb.append(I18nUtil.getInstance().getMessage("conf.invalid.prompt"));
		sb.append("[");
		sb.append(I18nUtil.getInstance().getMessage("conf.err." + configKey));
		sb.append("]");
		String msg = sb.toString();
		RequestContext.saveSessionErrorMessage(RequestContext.getCurrentHttpRequest(),msg); 
		logger.warn(msg);
	}


	public void setServerSideDataCacheEnabled(boolean avalue) {
		this.serverSideDataCacheEnabled = avalue;
	}

	public void setSystemConfigManager(SystemConfigManager systemConfigManager) {
		this.systemConfigManager = systemConfigManager;
	}

	public void setWebAppRootPath(String webAppRootPath) {
		this.webAppRootPath = webAppRootPath;
	}

	
	public boolean isEaiEnabled() {
		return eaiEnabled;
	}

	public void setEaiEnabled(boolean eaiEnabled) {
		this.eaiEnabled = eaiEnabled;
	}


	/**
	 * 后台不再可修改此项，因为修改此项后，后台web.xml和AppMediaServlet均需要修改。 媒体文件web路径
	 * 
	 * @return
	 */
	public String getMediaCategory() {
		return "/media";
	}

	
	/**
	 * 媒体文件目录（全）
	 * case:前后台集中部署,则统一为"media"
	 * case:后台隔离部署，则为各自安装路径下的media目录,注意：后台是media/admin,前台是media/front
	 * 
	 * @return
	 */
	public String getMediaCategoryFull() {
		String mediaCategoryStr = getMediaCategory();
		if (this.isAdminApplicationIsolate()) {
			if (RequestContext.isFront()) {
				mediaCategoryStr += "/front";
			} else {
				mediaCategoryStr += "/admin";
			}
		}
		return mediaCategoryStr;

	}

	/**
	 * 媒体文件目录（简单,不带media）
	 * case:前后台集中部署,则统一为""
	 * case:后台隔离部署，则为各自安装路径下的media目录,注意：后台是admin,前台是front
	 * 
	 * @return
	 */
	public String getMediaCategorySimple() {
		String mediaCategoryStr = "";
		if (this.isAdminApplicationIsolate()) {
			if (RequestContext.isFront()) {
				mediaCategoryStr = "front";
			} else {
				mediaCategoryStr = "admin";
			}
		}
		return mediaCategoryStr;

	}

	/**
	 * 上传媒体文件时候的目录全路径
	 * 当使用upload控件，controller的时候用到。
	 * case:前后台集中部署,则统一为前台media目录(例如：D:/workspace-ver3.5/StoreFront/web/media)
	 * case:后台隔离部署，则为各自安装路径下的media目录,注意：后台是media/admin(例如：D:/workspace-ver3.5/StoreAdmin/web/media/admin)
	 * 前台是media/front(例如：D:/workspace-ver3.5/StoreFront/web/media/front)
	 * 
	 * @return
	 */
	public String getMediaUploadPath() {
		String mediaPath = getMediaCategory();
		if (this.isAdminApplicationIsolate()) {
			if (RequestContext.isFront()) {
				mediaPath += "/front";
			} else {
				mediaPath += "/admin";
			}
			return getWebAppRootPath() + mediaPath;
		} else {
			return getStoreFrontInstallationPath() + mediaPath;
		}
	}

	/**
	 * 取得媒体文件时候的目录全路径
	 * 当使用文件流的时候用到。 
	 * case:前后台集中部署,则统一为前台media目录(例如：D:/workspace-ver3.5/StoreFront/web/media)
	 * case:后台隔离部署，则为各自安装路径下的media目录,后台(例如：D:/workspace-ver3.5/StoreAdmin/web/media)
	 * 前台(例如：D:/workspace-ver3.5/StoreFront/web/media)
	 * 
	 * @return
	 */
	public String getMediaStorePath() {
		String mediaPath = getMediaCategory();
		if (this.isAdminApplicationIsolate()) {
			return getWebAppRootPath() + mediaPath;
		} else {
			return getStoreFrontInstallationPath() + mediaPath;
		}
	}
	/**
	 * 取得媒体文件全路径
	 * @param mediaUrl
	 * @return
	 */
	public String getMediaStorePath(String mediaUrl){
		return getMediaStorePath()+"/"+mediaUrl;
	}

	/**
	 * 查看媒体文件时候的URL
	 * 当查看URL,使用的时候用到。 
	 * case:前后台集中部署,则统一为前台media目录(例如：http://localhost:20080/StoreFront/media)
	 * case:后台隔离部署，则为各自安装路径下的media目录,注意：后台是media/admin(例如：http://localhost:20080/StoreAdmin/media/admin)
	 * 前台是media/front(例如：http://localhost:20080/StoreFront/media/front)
	 */
	public String getMediaViewPath() {
		if (this.isAdminApplicationIsolate()) {
			if (RequestContext.isFront()) {
				return getStoreFrontSiteUrl() + getMediaCategoryFull();
			} else {
				return getStoreAdminSiteUrl() + getMediaCategoryFull();
			}
		} else {
			return getStoreFrontSiteUrl() + getMediaCategoryFull();
		}
	}

	/**
	 * 查看媒体文件时候的URL
	 * 当查看URL,使用的时候用到。 
	 * case:前后台集中部署,则统一为前台media目录(例如：http://localhost:20080/StoreFront/media)
	 * case:后台隔离部署，则为各自安装路径下的media目录,后台(例如：http://localhost:20080/StoreAdmin/media)
	 * 前台(例如：http://localhost:20080/StoreFront/media)
	 */
	public String getMediaViewShortPath() {
		String mediaPath = getMediaCategory();
		if (this.isAdminApplicationIsolate()) {
			if (RequestContext.isFront()) {
				return getStoreFrontSiteUrl() + mediaPath;
			} else {
				return getStoreAdminSiteUrl() + mediaPath;
			}
		} else {
			return getStoreFrontSiteUrl() + mediaPath;
		}
	}


	public String getFileServerUrl(){
		return getConfig("fileServerUrl", "D:\\workspace-V3.7\\StoreFront\\web");
	}
	
	/**
	 * 默认日期显示格式，带时分秒的日期格式
	 * @return
	 */
	public String getDateTimePattern() {
		return getConfig("global.dateTimePattern", "yyyy-MM-dd HH:mm:ss");
	}
	/**
	 * 默认日期显示格式，不带时分秒的日期格式
	 * @return
	 */
	public String getDatePattern() {
		return getConfig("global.datePattern", "yyyy-MM-dd");
	}
	
	
	/**
	 * 前端网站的标题
	 * 
	 * @return
	 */
	public String getStoreTitle() {
		return getConfig("storeTitle", "");
	}
	
	/**
	 * 商店网址
	 * @return
	 */
	public String getStoreFrontSiteUrl() {
		return getConfig("storeFrontSiteUrl", "ERROR: StoreFrontSiteUrl_NOT_Configured");
	}

	/**
	 * 商店后台网址
	 * @return
	 */
	public String getStoreAdminSiteUrl() {
		return getConfig("storeAdminSiteUrl", "ERROR: StoreAdminSiteUrl_NOT_Configured");
	}
	
	/**
	 * mobile版网址
	 * @return
	 */
	public String getMobileFrontSiteUrl() {
		return getConfig("mobileFrontSiteUrl", "ERROR: MobileFrontSiteUrl_NOT_Configured");
	}
	
	/**
	 * 是否前后台应用隔离
	 * @return
	 */
	public boolean isAdminApplicationIsolate() {
		return getConfigAsBool("isAdminApplicationIsolate", false);
	}
	/**
	 * 网店系统（前端）安装路径
	 * @return
	 */
	public String getStoreFrontInstallationPath() {
		return FileUtil.formatPath(getConfig("storeFrontInstallationPath"));
	}
	
	/**
	 * 是否启用全文搜索
	 * @return
	 */
	public boolean isOpenFulltextSearch() {
		return getConfigAsBool("isOpenFulltextSearch", false);
	}
	/**
	 * 获得是否启用全文搜索信息
	 * @return
	 */
	public String getIsOpenFulltextSearch() {
		return getConfig("isOpenFulltextSearch", "ERROR: isOpenFulltextSearch_NOT_Configured");
	}
	/**
	 * 全文搜索地址
	 * @return
	 */
	public String getSearchServerUrl(){
		return getConfig("searchServerUrl", "ERROR: searchServerUrl_NOT_Configured");
	}
	
	/**
	 * 是否启用统一验证
	 * @return
	 */
	public boolean isOpenCasService() {
		return getConfigAsBool("isOpenCasService", false);
	}
	/**
	 * CAS服务器地址
	 * @return
	 */
	public String getCasServerUrl(){
		return getConfig("casServerUrl", "ERROR: casServerUrl_NOT_Configured");
	}
	/**
	 * 前端网店首页关键字
	 * @return
	 */
	public String getStoreKeyWords() {
		return getConfig("storeKeyWords", "");
	}
	/**
	 *前端网店首页描述
	 * @return
	 */
	public String getStoreDescription() {
		return getConfig("storeDescription", "");
	}

	/**
	 * 系统货币符号
	 * @return
	 */
	public String getDefaultCurrencySymbol() {
		return getConfig("defaultCurrencySymbol", "¥");
	}
	/**
	 * 批量导入连续出错阈值
	 * @return
	 */
	public int getContinuouslyFailCountStopImport() {
		return getConfigAsInt("continuouslyFailCountStopImport", 50);
	}
	/** 
	 * 多少秒刷新一次后台头部的系统提示 
	 * @return
	 */
	public int getSystemAlertInterval() {
		return getConfigAsInt("systemAlertInterval", 10);
	}
	
	/**
	 * 是否开启前台下订单功能
	 * @return
	 */
	public boolean getIsOpenFrontOrder() {
		return this.getConfigAsBool("isOpenFrontOrder", true);
	}
	/**
	 * 是否允许匿名结帐
	 * @return
	 */
	public boolean getIsAnonymousCheckoutEnabled() {
		return getConfigAsBool("isAnonymousCheckoutEnabled", true);
	}
	/**
	 * 选择礼品包装
	 * 开启后将在一页结帐页面中出现包装选择部分。
	 * @return
	 */
	public boolean getIsSupportWrapExpress() {
		return this.getConfigAsBool("isSupportWrapExpress", true);
	}

	/**
	 *  结账时是否支持发票
	 */
	public boolean isInvoiceSupported() {
		return this.getConfigAsBool("isInvoiceSupported", true);
	}
	/**
	 * 订单最低购物金额
	 */ 
	public int getMinimumPurchaseAmount() {
		return getConfigAsInt("minimumPurchaseAmount", 0);
	}
	/**
	 * 购物车保存时间（天）
	 * @return
	 */
	public int getCookieMaxAge() {
		return getConfig("cookieMaxAge", Constants.COOKIE_DEFAULT_MAXAGE);
	}
	/**
	 * 礼券有效期（年）
	 * @return
	 */
	public int getGiftCertificateExpireYears() {
		return getConfig("giftCertificateExpireYears", 2);
	}
	/**
	 * 购买礼券的最小金额
	 * @return
	 */
	public int getGiftCertificateMinAmt() {
		return getConfig("giftCertificateMinAmt", 10);
	}
	/**
	 * 购买礼券的最大金额
	 * @return
	 */
	public int getGiftCertificateMaxAmt() {
		return getConfig("giftCertificateMaxAmt", 1000);
	}
	/**
	 * 是否允许优惠叠加
	 */
	public boolean isAllowSystemRulesWhenUseCoupon(){
		return this.getConfigAsBool("isAllowSystemRulesWhenUseCoupon", true);
	}
	/**
	 * 结帐时是否支持使用积分支付
	 */
	public boolean isShopPointPaymentEnabled() {
		return this.getConfigAsBool("isShopPointPaymentEnabled", true);
	}
	/**
	 * 积分支付占订单金额的百分比
	 */ 
	public int getShopPointPaymentLimitPercentage() {
		return this.getConfigAsInt("shopPointPaymentLimitPercentage", 10);
	}
	/**
	 * 积分与现金的汇率
	 */ 
	public int getShopPointExchangeRate() {
		return this.getConfigAsInt("shopPointExchangeRate", 100);
	}
	/**
	 * 是否允许前台客户取消订单
	 * @return
	 */
	public boolean getIsCancelOrderEnabled() {
		return getConfigAsBool("isCancelOrderEnabled", true);
	}
	/**
	 * 订单超时取消期限(天)
	 * @return
	 */
	public int getOrderCancelDay() {
		return getConfigAsInt("orderCancelDay", 3);
	}
	/**
	 * 邮局帐号-商户客户帐号
	 * @return
	 */
	public String getPostofficeAccountNo() {
		return getConfig("postofficeAccountNo", "(empty)");
	}
	/**
	 * 邮局帐号-收款人
	 * @return
	 */
	public String getPostofficePayee() {
		return getConfig("postofficePayee", "(empty)");
	}
	/**
	 * 银行户名
	 * @return
	 */
	public String getBankAccountName() {
		return getConfig("bankAccountName", "(empty)");
	}
	/**
	 * 银行帐号
	 * @return
	 */
	public String getBankAccountNo() {
		return getConfig("bankAccountNo", "(empty)");
	}
	/**
	 * 开户行
	 * @return
	 */
	public String getBankAccountAddress() {
		return getConfig("bankAccountAddress", "(empty)");
	}
	/**
	 * 重量单位
	 * @return
	 */
	public String getWeightUnit() {
		return getConfig("weightUnit", "g");
	}
	/**
	 * 是否启用商品浏览历史
	 * @return
	 */
	public boolean getIsRecentViewEnabled() {
		return getConfigAsBool("isRecentViewEnabled", true);
	}
	/**
	 * 注册激活模式
	 * 参考 Constants.CUSTOMER_ACTIVE_EMAIL
	 */
	public Short getCustomerRegisterActiveMode() {
		return Short.valueOf(getConfig("customerRegisterActiveMode", "0"));
	}
	/**
	 * 用户验证连接有效时间
	 * @return
	 */
	public int getValidationSessionTime() {
		return getConfig("validationSessionHours", 2);
	}
	/**
	 * 是否允许匿名用户订阅消息列表
	 * @return
	 */
	public boolean getIsAnonymousNewsSubscriptionEnabled() {
		return getConfigAsBool("isAnonymousNewsSubscriptionEnabled", true);
	}
	/**
	 * 是否打开在线服务
	 * @return
	 */
	public boolean getIsOpenOnlineService() {
		return this.getConfigAsBool("isOpenOnlineService", true);
	}
	/**
	 * 注册获赠积分
	 * 
	 * @return
	 */
	public int getRegistrationShopPointAmount() {
		return getConfigAsInt("registrationShopPointAmount", 10);
	}
	
	/**
	 * 评论前n为客户能获赠积分
	 * 
	 * @return
	 */
	public Integer getAddReviewFrontMans() {
		return getConfigAsInt("addReviewFrontMans", 5);
	}

	/**
	 * 评论获赠积分
	 * 
	 * @return
	 */
	public Integer getAddReviewShopPointAmount() {
		return getConfigAsInt("addReviewShopPointAmount", 10);
	}

	/**
	 * 评论资格 0=匿名 1=登录用户 2=购此商品用户
	 * 
	 * @return
	 */
	public Integer getCustomerReviewRight() {
		return getConfigAsInt("customerReviewRight", 1);
	}

	/**
	 * 评论回复资格 0=匿名 1=登录用户
	 * 
	 * @return
	 */
	public Integer getCustomerReviewReplyRight() {
		return getConfigAsInt("customerReviewReplyRight", 1);
	}
	/**
	 * 评论过期天数
	 * 
	 * @return
	 */
	public Integer getReviewExpiredDays() {
		return getConfigAsInt("customerReviewExpiredDays", 180);
	}
	/**
	 * 咨询资格 0=匿名 1=登录用户
	 * 
	 * @return
	 */
	public Integer getCustomerConsultRight() {
		return getConfigAsInt("customerConsultRight", 0);
	}

	/**
	 * 客户导入时，客户默认状态 默认激活
	 * 
	 * @return
	 */
	public Short getCustomerImportDefaultUserStatus() {
		return new Short(getConfig("customerImportDefaultUserStatus", "1"));
	}

	/**
	 * 客户导入时，客户默认密码 默认：123456
	 * 
	 * @return
	 */
	public String getCustomerImportDefaultPassword() {
		return getConfig("customerImportDefaultPassword", "123456");
	}
	/**
	 * 页面缓存时间
	 * @return
	 */
	public int getServerSidePageCacheSeconds() {
		return getConfigAsInt("serverSidePageCacheSeconds", 3600);
	}
	/**
	 * 前台进行缓存的URL页面
	 * @return
	 */
	public String getCachableUrls() {
		return getConfig("cachableUrls", "/noPage.html");
	}
	/**
	 * js、css和图片缓存时间
	 * @return
	 */
	public int getBrowserSidePageCacheSeconds() {
		return getConfigAsInt("browserSidePageCacheSeconds", 3600000);
	}
	/**
	 * js、css客户端缓存识别码
	 * @return
	 */
	public String getRs() {
		return getConfig("rs", "20101210-1616");
	}
	/**
	 * 是否启用登录验证码
	 * @return
	 */
	public boolean getIsValidationCodeEnabled() {
		return getConfigAsBool("isValidationCodeEnabled", true);
	}
	/**
	 * 是否启用“记住我”自动登录方式
	 * @return
	 */
	public boolean getIsRememberMeEnabled() {
		return getConfigAsBool("isRememberMeEnabled", true);
	}
	/**
	 * 登录失败次数限制
	 * @return
	 */
	public int getMaxLoginFailTimes() {
		return getConfig("maxLoginFailTimes", 5);
	}
	
	/**
	 * 密码的加密算法
	 * @return
	 */
	public String getPasswordEncryptionAlgorithm() {
		return getConfig("passwordEncryptionAlgorithm", "SHA");
	}
	/**
	 * 模板
	 * @return
	 */
	public String getStoreFrontTheme() {
		return getConfig("storeFrontTheme", "default");
	}
	
	@SuppressWarnings("deprecation")
	public Locale getSystemLocale() {
		return I18nUtil.getLocaleByCode(getSystemLocaleCode());
	}

	public String getSystemLocaleCode() {
		return getIsStoreFront() ? getConfig("storeFrontLocale", "zh_CN") : getConfig("storeAdminLocale", "zh_CN");
	}
	
	/* ========================================邮件设置 ，包括业务上的邮件设置，BEGIN================================== */
	/**
	 * 缺省的系统邮件发件人地址
	 */
	public String getDefaultEmailSender() {
		return getConfig("defaultSystemEmail", "proBIZ@probiz.com");
	}
	/**
	 * 库存提醒收件人邮件地址
	 */
	public String getStockAlertRecipientEmail() {
		return getConfig("stockAlertRecipientEmail", "stockAlert@probiz.cn");
	}
	
	/**
	 * 客户服务邮件发件人地址
	 * @return
	 */
	public String getCustomerServiceEmail() {
		return getConfig("customerServiceEmail","customerService@probiz.cn");
	}
	/**
	 * 报告系统错误邮件的收件人地址
	 * @return
	 */
	public String getBugReportEmail() {
		return getConfig("bugReportEmail", "bugReport@probiz.cn");
	}

	/**
	 * 是否开启邮件队列
	 * @return
	 */
	public boolean isQueueDisabled() {
		return getConfigAsBool("mail.disableQueue", false);
	}
	/**
	 * 失败后重试次数
	 * @return
	 */
	public int getMaxSendTimes() {
		return getConfigAsInt("mail.maxSendTimes", 5);
	}
	/**
	 * 邮件队列发送的批处理数量
	 * @return
	 */
	public int getNumOfEmailsPerTime() {
		return getConfigAsInt("mail.numOfEmailsPerTime", 10);
	}
	/**
	 * 重试间隔
	 * @return
	 */
	public int getRetryIntervalSecs() {
		return getConfigAsInt("mail.retryIntervalSecs", 300);
	}
	/**
	 * 邮件服务器地址
	 */
	public String getMailHost() {
		return getConfig("mail.host", "");
	}
	/**
	 * 协议
	 * @return
	 */
	public String getMailProtocol() {
		return getConfig("mail.protocol", "smtp");
	}
	/**
	 * 帐号
	 * @return
	 */
	public String getMailUsername() {
		return getConfig("mail.username", "");
	}
	/**
	 * 密码
	 * @return
	 */
	public String getMailPassword() {
		return getConfig("mail.password", "");
	}
	/**
	 * 邮件所使用的编码
	 * @return
	 */
	public String getMailDefaultEncoding() {
		return getConfig("mail.defaultEncoding", "UTF-8");
	}
	/**
	 * 端口
	 * @return
	 */
	public int getMailPort() {
		return getConfigAsInt("mail.port", 25);
	}
	/**
	 * 要求身份验证
	 * @return
	 */
	public String getMailAuth() {
		return getConfig("mail.auth", "true");
	}
	/**
	 * 超时（单位：秒）
	 * @return
	 */
	public String getMailTimeout() {
		return getConfig("mail.timeout", "300000");
	}
	/**
	 * 开启调试模式
	 * @return
	 */
	public String getMailDebug() {
		return getConfig("mail.debug", "false");
	}
	/**
	 * 邮件保留多少天
	 * @return
	 */
	public int getDaysToKeep() {
		return getConfigAsInt("mail.daysToKeep", 10);
	}
	/**
	 * 开启加密传输方式
	 * @return
	 */
	public boolean getTlsEnable() {
		return getConfigAsBool("mail.tlsEnable", false);
	}

	/* ========================================邮件设置 END================================== */

	/**
	 * 下次不再显示向导
	 * @return
	 */
	public boolean getIsShowWizard() {
		return this.getConfigAsBool("isShowWizard", true);
	}
	
	/**
	 * 是否开启短信发送
	 */
	public boolean isOpenMsgSend() {
		return this.getConfigAsBool("isOpenMsgSend", true);
	}

	/**
	 * 短信账号
	 * @return
	 */
	public String getSerialNo() {
		return getConfig("serialNo", "");
	}
	

	/**
	 * 短信密码
	 * @return
	 */
	public String getSerialNoPassWord() {
		return getConfig("serialNoPassWord", "");
	}
	
	
	/**
	 * 批量发送短信条数
	 * @return
	 */
	public int getSmsBatchSendCount(){
		return getConfigAsInt("smsBatchSendCount", 10);
	}
	
	/**
	 * 最大发送短信次数。
	 * @return
	 */
	public int getSmsMaxSendTimes(){
		return getConfigAsInt("smsMaxSendTimes", 3);
	}
	
	/**
	 * 是否开启流量分析
	 * @return
	 */
	public boolean isAnalyticsDisabled(){
		return this.getConfigAsBool("isAnalyticsDisabled", true);
	}
	
	/**
	 * 流量分析代码
	 * @return
	 */
	public String getAnalyticsCode(){
		return getConfig("analyticsCode", "");
	}
	/**
	 * 获得快递100接口的使用方式
	 * 0=不使用快递100
	 * 1=使用APIOne接口，查询最新一行的结果
	 * 2=使用API接口，返回完整结果
	 * @return
	 */
	public Short getKuaidi100Type(){
		return new Short(getConfig("kuaidi100Type", "0"));
	}
	/**
	 * 身份key，为16位字母和数字的组合
	 * @return
	 */
	public String getKuaidi100IdKey(){
		return getConfig("kuaidi100IdKey", "");
	}
	
	/**
	 * 模板
	 * @return
	 */
	public String getMobileFrontTheme() {
		return "default";
	}
	
	
}
